<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>构造函数</title>
</head>
<body>
    
</body>
</html>
<script>
    //原型属性
    //构造函数只会产生一个原型对象
    // function hd(){
    //     this.show = function(){
    //         return "show in object";
    //     }
    // }

    // hd.prototype.show = function(){
    //     return "show in prototype";
    // }

    // //构造函数在被new的时候吧构造函数的原型赋值给新对象，如果对象中存在属性将使用对象属性，不会在到原型上查找方法
    // const obj = new hd();
    // console.log(obj.show());


    // function hd(){}
    // hd.prototype.name = "hdcms";
    // const obj1 = new hd();
    // console.log(obj1.name)

    // hd.prototype = {
    //     name : '后盾人'
    // };

    // const obj2 = new hd();
    // console.dir(obj2.name);


    //constructor
    //构造函数的原型中包含属性constructor指向该构造函数
    // function User(name){
    //     this.name = name;
    // }

    // let hd = new User("后盾人");
    // let xj = new hd.constructor('向军')
    // console.log(xj)


    //以下代码直接设置了构造函数的原型将constructor丢失
    // function User(name){
    //     this.name = name;
    // }
    // //更改构造函数的原型
    // //正确的做法是要保证原型中的constructor指向构造函数
    // User.prototype = {
    //     constructor:User,
    //     show:function(){}
    // };
    // let hd = new User("后盾人");
    // let xj = new hd.constructor("星君");
    // console.log(xj);


    //使用优化
    //使用构造函数会产生函数复制会造成内存的占用，以及函数不能共享的问题
    // function User(name){
    //     this.name = name;
    //     this.get = function(){
    //         return this.name;
    //     }
    // }

    // let lisi = new User("小明");
    // let wangwu = new User("王五");
    // console.log(lisi.get ==  wangwu.get);

    //体验通过原型方法定义方法不会产生复制函数
    // function User(name){
    //     this.name = name;
    // }

    // User.prototype.get = function(){
    //     return "后盾人" + this.name;
    // }

    // let lisi = new User("李四");
    // let wangwu = new User("王五");
    // //因为使用的是一个原型上的get  所以是相同的   所以也就是省下了内存
    // //并且多个对象可以共享的
    // console.log(lisi.get == wangwu.get);

    // //通过修改原型方法会影响到所有对象的调用，因为方法是公用的！
    // lisi.__proto__.get = function(){
    //     return "厚度柔嫩sss" + this.name;
    // }
    // console.log(lisi.get());
    // console.log(wangwu.get());




    //使用原型为多个实例共享属性
    // function User(name,age){
    //     this.name = name;
    //     this.age = age;
    //     this.show = () => {
    //         return `你在${this.site}的姓名是${this.name},年龄是${this.age}`;
    //     }
    // }

    // User.prototype.site = '后盾人';
    // let lisi = new User('李四',12);
    // let xiaoming = new User('小明',12);

    // console.log(lisi.show());
    // console.log(xiaoming.show());


    //将方法定义在原型上共享，解决通过构造函数创建对象的时候对象函数复制的内存占用问题
    // function User(name){
    //     this.name = name;
    // }

    // User.prototype.get = function(){
    //     return '后盾人' + this.name;
    // }


    // let lisi = new User('小明');
    // let wangwu = new User('王五');

    // console.log(lisi.get == wangwu.get);
    // //通过修改原型的方法会影响所有对象的调用，因为方法是公用的
    // lisi.__proto__.get = function(){
    //     return '厚度柔嫩' + this.name;
    // }

    // console.log(lisi.get());
    // console.log(wangwu.get());

    //使用Object.assign一次设置原型方法来复用
    // function User(name,age){
    //     this.name = name;
    //     this.age = age;
    // }

    // //给对象的原型上增加方法  【将原型和后面的对象进行合并】
    // //这个的目的是为了给对象的原型上的方法合并两个方法   
    // //那么在原型上的方法就可以直接使用  同时也不占用内存
    // Object.assign(User.prototype,{
    //     getName(){
    //         return this.name;
    //     },
    //     getAge(){
    //         return this.age;
    //     }
    // });

    // let lisi = new User('李四',12);
    // let xiaoming = new User('小明',32);
    // console.log(lisi.getName());
    // console.log(lisi.__proto__);

    //体验继承
    "use strict";

    //lisi在执行getName 方法的时候会从自身向上查找原型 ，也就是原型链特征
    //如果本身对象就有getName方法  那么就不会继续追朔原型链

    function User(){}
    User.prototype.getName = function(){
        return this.name;
    }

    
    function Stu(name){
        this.name = name;
        this.getName = function(){
            return '后盾人' + this.name;
        }
    }

    //修改Stu的原型为USER
    Stu.prototype = new User();
    const lisi = new Stu("李四");
    console.log(lisi.__proto__);
    console.log(lisi.getName())









    


    

    

</script>